package com.insight.common.enums;

import lombok.Getter;

/**
 * T015: 任务状态枚举
 * 表示元数据采集任务的执行状态
 */
@Getter
public enum TaskStatus {

    /**
     * 任务等待中
     */
    PENDING("Pending", "等待执行", "#17a2b8", false, false),

    /**
     * 任务执行中
     */
    RUNNING("Running", "执行中", "#007bff", false, false),

    /**
     * 任务执行成功
     */
    SUCCESS("Success", "执行成功", "#28a745", true, false),

    /**
     * 任务执行失败
     */
    FAILED("Failed", "执行失败", "#dc3545", true, true),

    /**
     * 任务已取消
     */
    CANCELLED("Cancelled", "已取消", "#6c757d", true, false);

    /**
     * 英文名称
     */
    private final String code;

    /**
     * 中文描述
     */
    private final String description;

    /**
     * 状态颜色（用于UI显示）
     */
    private final String color;

    /**
     * 是否为终态（任务已结束）
     */
    private final boolean terminal;

    /**
     * 是否为失败状态
     */
    private final boolean failure;

    TaskStatus(String code, String description, String color, boolean terminal, boolean failure) {
        this.code = code;
        this.description = description;
        this.color = color;
        this.terminal = terminal;
        this.failure = failure;
    }

    /**
     * 根据代码获取任务状态
     *
     * @param code 状态代码
     * @return 任务状态枚举
     * @throws IllegalArgumentException 如果代码不匹配任何状态
     */
    public static TaskStatus fromCode(String code) {
        for (TaskStatus status : values()) {
            if (status.code.equalsIgnoreCase(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown task status code: " + code);
    }

    /**
     * 判断是否可以取消任务
     *
     * @return true 如果任务状态为 PENDING 或 RUNNING
     */
    public boolean isCancellable() {
        return this == PENDING || this == RUNNING;
    }

    /**
     * 判断是否为进行中状态
     *
     * @return true 如果状态为 RUNNING
     */
    public boolean isRunning() {
        return this == RUNNING;
    }

    /**
     * 判断是否为成功状态
     *
     * @return true 如果状态为 SUCCESS
     */
    public boolean isSuccess() {
        return this == SUCCESS;
    }

    /**
     * 判断任务是否已完成（无论成功或失败）
     *
     * @return true 如果任务处于终态
     */
    public boolean isCompleted() {
        return terminal;
    }
}
